#ifndef TSTRUCT_H
#define TSTRUCT_H

#include <QObject>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QFile>

/**
 *  使用方法 定义结构体例：NoteT
 *      NoteT file1,tfile;
 *      file1.name = "file1";
 *      file1.backGroundColor = "#FFFFFF";
 *
 *      QHash<QString, NoteT> notes;
 *      // 填充 notes...
 *      notes.insert("file1",file1);
 *      Tstruct *tt =new Tstruct;
 *      // 保存 notes 到文件
 *      tt->saveHashToFile("notes.json", notes);
 *      // 从文件加载 notes
 *      tt->loadHashFromFile(notes,tfile,"notes.json");
 *
**/
//结构体 NoteT 自行实现
struct NoteT {
    QString name;
    QString content;
    QString backGroundColor;
    QString fontColor;
    QString priority;
    QString status;
    QString year;
    QString month;

    // 将 NoteT 转换为 QJsonObject
    QJsonObject toJsonObject() const {
        QJsonObject obj;
        obj["name"] = name;
        obj["content"] = content;
        obj["backGroundColor"] = backGroundColor;
        obj["fontColor"] = fontColor;
        obj["priority"] = priority;
        obj["status"] = status;
        obj["year"] = year;
        obj["month"] = month;
        return obj;
    }

    // 从 QJsonObject 转换回 NoteT
    static NoteT fromJsonObject(const QJsonObject &obj) {
        NoteT note;
        note.name = obj["name"].toString();
        note.content = obj["content"].toString();
        note.backGroundColor = obj["backGroundColor"].toString();
        note.fontColor = obj["fontColor"].toString();
        note.priority = obj["priority"].toString();
        note.status = obj["status"].toString();
        note.year = obj["year"].toString();
        note.month = obj["month"].toString();
        return note;
    }
};


//以下无需改动
class Tstruct : public QObject
{
    Q_OBJECT
public:
    explicit Tstruct(QObject *parent = nullptr){}


    /**
     * 序列化hash结构体
    **/
    template <typename T> //QHash<QString, NoteT>
    QJsonArray hashToJsonArray(const T &hash) {
        QJsonArray array;
        for (const auto[key, value] : hash.asKeyValueRange()) {
            QJsonObject obj = value.toJsonObject();
            obj["key"] = key; // 存储键作为对象的一部分，以便在反序列化时恢复它
            array.append(obj);
        }
        return array;
    }

    /**
     * 反序列化hash结构体
    **/
    template <typename T,typename S> //QHash<QString, NoteT> sturcut
    void jsonArrayToHash(T &hash,S &struct_type,const QJsonArray &array) {
        for (const QJsonValue &value : array) {
            QJsonObject obj = value.toObject();
            QString key = obj["key"].toString();
            struct_type = S::fromJsonObject(obj);
            hash.insert(key, struct_type);
        }
    }

    /**
     * 保存Hash数据到文件
    **/
    template <typename T> //QHash<QString, NoteT>
    void saveHashToFile(const QString &filePath, const T &notes){
        QFile file(filePath);
        if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
            return;

        QJsonArray jsonArray = hashToJsonArray(notes);
        QJsonDocument jsonDoc(jsonArray);
        QByteArray data = jsonDoc.toJson(QJsonDocument::Indented);
        file.write(data);
        file.close();
    }

    /**
     * 从文件加载数据到Hash
    **/
    template <typename T,typename S> //QHash<QString, NoteT> sturcut
    void loadHashFromFile(T &hash,S &struct_type,const QString &filePath){
        QFile file(filePath);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
            return ;

        QByteArray data = file.readAll();
        QJsonDocument jsonDoc = QJsonDocument::fromJson(data);
        if (jsonDoc.isNull())
            return ;

        QJsonArray jsonArray = jsonDoc.array();
        jsonArrayToHash(hash, struct_type, jsonArray);
    }
signals:
};

#endif // TSTRUCT_H
